package indi.h.mlx.sql.inter;

import indi.h.mlx.sql.items.SQL;
import indi.h.mlx.sql.items.SQLData;

public interface SQLStructure {
	public enum OrderByType {
		DESC, ASC;
	}

	public enum SqlType {
		INSERT, UPDATE_BY_ID, UPDATE_BY_NONE, DELETE_BY_ID, DELETE_BY_ALL, SELECT
	}

	public enum ParamType {
		ID, ROOT, ALL, JOIN
	}

	public enum JoinType {
		AND, OR, AND_OR, OR_AND
	}

	/**
	 * 添加参数,若存在,会进行覆盖
	 * 
	 * @param column
	 * @param value
	 */
	public void addParam(SQLData sql, ParamType paramType);

	/**
	 * 删除参数,同名称参数只有一个
	 * 
	 * @param column
	 * @param value
	 */
	public void removeParam(String fieldName, ParamType paramType);

	/**
	 * 弹出sql语句,根据类型弹出
	 * 
	 * @param sqlType
	 * @return
	 */
	public SQL splitSql(SqlType sqlType);

	/**
	 * 输入排序类型
	 * 
	 * @param columns
	 * @param type
	 * @return
	 */
	public SQLStructure orderBy(String[] filedNames, OrderByType type);

	/**
	 * 分页
	 * 
	 * @param start
	 * @param length
	 * @return
	 */
	public SQLStructure limit(Integer start, Integer length);

	/**
	 * 获取数据条数
	 * 
	 * @param length
	 * @return
	 */
	public SQLStructure limit(Integer length);

	/**
	 * 分组
	 * 
	 * @param columns
	 * @return
	 */
	public SQLStructure groupBy(String[] filedNames);

	/**
	 * 累加指定行
	 * 
	 * @param columns
	 * @return
	 */
	public SQLStructure sum(String[] filedNames);

	/**
	 * 统计,true是删除设置的选择行,false是和选择行一起
	 * 
	 * @param clearColumn
	 * @return
	 */
	public SQLStructure count(boolean clearColumn);

	/**
	 * 设置选择行
	 * 
	 * @param params
	 */
	public void setSelectParam(String[] filedNames);

	/**
	 * 设置where的选择参数,以and连接
	 * 
	 * @param columns
	 * @param datas
	 * @param matchs
	 * @return
	 */
	public SQLStructure and(String[] filedNames, Object[] datas, String[] matchs);

	/**
	 * 设置where的选择参数,以and内连接,or外连接
	 * 
	 * @param columns
	 * @param datas
	 * @param matchs
	 * @return
	 */
	public SQLStructure orAnd(String[] filedNames, Object[] datas, String[] matchs);

	/**
	 * 设置where的选择参数,以or连接
	 * 
	 * @param columns
	 * @param datas
	 * @param matchs
	 * @return
	 */
	public SQLStructure or(String[] filedNames, Object[] datas, String[] matchs);

	/**
	 * 设置where的选择参数,以or内连接,and外连接
	 * 
	 * @param columns
	 * @param datas
	 * @param matchs
	 * @return
	 */
	public SQLStructure andOr(String[] filedNames, Object[] datas, String[] matchs);

	/**
	 * 清除自定义where参数
	 */
	public void clearCustomWhere();

	/**
	 * 清除group by,order by,limit
	 */
	public void claerWhereEnd();

	/**
	 * 清除sum(),count(),setSelectParam()设置的选择参数
	 */
	public void clearSelectParam();

}
